package com.athuahua.lambda;

import org.junit.Test;

/**
 * @Author: huahua
 * @Date: 2024/10/24 0024
 * @Time: 15:39
 * @Description:
 */

@FunctionalInterface //检查接口，检查是否是函数式接口
interface MyInterface {
    int sum(int i, int j);
}

interface MyHaha {
    int haha();
}

interface MyHehe {
    int hehe(int x);
}

//1.自己写实现,但是非常麻烦
class MyClass implements MyInterface {
    public int sum(int i, int j) {
        return i + j;
    }
}

public class Lambda {

    //1.自己创建实现类对象重写接口方法
    @Test
    public void test() {

        MyInterface myInterface = new MyClass();
        System.out.println(myInterface.sum(1, 2));
    }

    //2.使用匿名内部类，但是依然很冗余
    @Test
    public void test2() {
        MyInterface myInterface = new MyInterface() {
            @Override
            public int sum(int i, int j) {
                return i + j;
            }
        };
        System.out.println(myInterface.sum(2, 3));
    }

    //3.使用lambda表达式 [语法糖] 参数列表 + 箭头 +  方法体
    //粘贴方法体 + ->
    @Test
    public void test3() {
        MyInterface myInterface = (int i, int j) -> {
            return i + j;
        };
        System.out.println(myInterface.sum(2, 3));
    }

    //4.简化写法
    //1.参数类型可以不写,只写(参数名) , 参数表最少只有一个()，或者只有一个参数名
    //2.方法体如果只有一句话 {} 可以省略
    @Test
    public void test4() {
        //1
        MyInterface myInterface = (i, j) -> {
            return i + j;
        };

        MyHaha myHaha = () -> {
            return 1;
        };

        MyHehe myHehe = x -> {
            return x;
        };

        //2
        MyHehe myHehe2 = x -> x + 1;
    }

}






















